package system

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"woo-server/coms/structs"
	"woo-server/coms/utils"
	"woo-server/models/api"
	"woo-server/models/db/system"
)

// 结构
type MenuService struct {
	*structs.Common
}

// 初始化
func NewMenuService(com *structs.Common) *MenuService {
	return &MenuService{com}
}

// 菜单列表
func (m *MenuService) GetMenusList(context *gin.Context, isTree bool) *api.ResultEntity {
	// 获取Redis缓存菜单
	treeList, _ := utils.RedisClient.Get("MenuTreeList").Result()
	list, _ := utils.RedisClient.Get("MenuList").Result()
	fmt.Println("------实时获取菜单分割线-----")
	// 没缓存则实时取
	if list == "" && treeList == "" {
		menuModel := system.NewMenus(m.Common)
		treeList, list := menuModel.GetAllMenu(true)
		utils.RedisClient.Set("MenuTreeList", utils.ToJson(treeList), 0)
		utils.RedisClient.Set("MenuList", utils.ToJson(list), 0)
		if isTree {
			return api.SuccessToJson(treeList, "菜单列表获取成功!")
		} else {
			return api.SuccessToJson(list, "菜单列表获取成功!")
		}

	}
	fmt.Println("------缓存权限菜单分割线-----")

	if isTree {
		// 获取缓存菜单
		var AdminMenus []system.AdminMenus
		json.Unmarshal([]byte(treeList), &AdminMenus)
		return api.SuccessToJson(AdminMenus, "菜单列表获取成功!")
	} else {
		// 获取缓存菜单
		var AdminMenus []system.AdminMenus
		json.Unmarshal([]byte(list), &AdminMenus)
		return api.SuccessToJson(AdminMenus, "菜单列表获取成功!")
	}
	//return api.SuccessToJson(AdminMenus, "缓存菜单列表获取成功!")
}

// 当前用户信息
func (m *MenuService) GetMenuConfig(context *gin.Context) *api.ResultEntity {
	menuModel := system.NewMenus(m.Common)
	data := menuModel.GetConfig()
	return api.SuccessToJson(data, "获取菜单配置成功!")
}

func (m *MenuService) PostSave(context *gin.Context) *api.ResultEntity {
	Name := context.PostForm("Name")
	if Name == "" {
		return api.Error("菜单名称不能为空!")
	}
	menuModel := system.NewMenus(m.Common)
	//fmt.Println("saveInfo",uint64(context.GetInt("AdminMenuId")))
	//params := context.QueryArray("data")
	Status := context.PostForm("Status")
	if Status != "" {
		menuModel.Status = uint(structs.SetInt(Status))
	} else {
		menuModel.Status = 1
	}
	// 基础参数
	//menuModel.SetCreateInfo(m.Claim.UserId)
	menuModel.Name = Name
	menuModel.Sort = uint(structs.SetInt(context.PostForm("Sort")))
	menuModel.Icon = context.PostForm("Icon")
	menuModel.WebUrl = context.PostForm("WebUrl")
	menuModel.Url = context.PostForm("Url")
	menuModel.IsHidden = uint(structs.SetInt(context.PostForm("IsHidden")))
	menuModel.Status = uint(structs.SetInt(context.PostForm("Status")))
	menuModel.ParentId = uint64(structs.SetInt(context.PostForm("ParentId")))
	AdminMenuId := uint64(structs.SetInt(context.PostForm("AdminMenuId")))
	var err error
	if AdminMenuId == 0 {
		// 基础参数
		menuModel.SetCreateInfo(m.Claim.UserId)
		// 执行创建
		err = menuModel.Create()
	} else {
		menuModel.AdminMenuId = AdminMenuId
		menuModel.CreateUser = uint64(structs.SetInt(context.PostForm("CreateUser")))
		menuModel.SetUpdateInfo(m.Claim.UserId)
		err = menuModel.Save()

	}
	if err != nil {
		// 日志
		utils.LogError("新增菜单报错:%s", err.Error())
		return api.Error(err.Error())
	}
	// ------------------清除菜单缓存----------------------
	utils.RedisClient.Set("MenuTreeList", "", 0)
	utils.RedisClient.Set("MenuList", "", 0)
	return api.Success("success")
}

func (m *MenuService) Delete(context *gin.Context) *api.ResultEntity {
	// 接收POST参数
	AdminMenuId := context.PostForm("AdminMenuId")
	// 校验参数
	if AdminMenuId == "" {
		return api.Error("ID不能为空!")
	}
	// 实例化数据库
	menuModel := system.NewMenus(m.Common)
	// 查询是否有子菜单
	menuModel.GetFirst("parent_id", structs.SetInt(AdminMenuId))
	// 判断子菜单
	if menuModel.AdminMenuId != 0 {
		return api.Error("该菜单下有子菜单.请先删除对应子菜单!")
	}
	// 执行删除
	menuModel.AdminMenuId = uint64(structs.SetInt(AdminMenuId))
	// 删除数据
	err := menuModel.Delete()
	if err != nil {
		utils.LogError("删除菜单报错:%s", err.Error())
		return api.Error(err.Error())
	}
	// ------------------清除菜单缓存----------------------
	utils.RedisClient.Set("RoleMenuList_1", "", 0)
	utils.RedisClient.Set("RoleMenuList_1", "", 0)
	utils.RedisClient.Set("MenuTreeList", "", 0)
	utils.RedisClient.Set("MenuList", "", 0)
	return api.Success("删除成功")
}
